# 用户数据传输对象 (DTOs) v2
from flask_restx import Namespace, fields

# 从主包导入命名空间
from .. import user_ns

# 用户模型 DTO v2 (添加了新字段)
user_model = user_ns.model('User', {
    'id': fields.Integer(description='用户ID', readonly=True),
    'username': fields.String(required=True, description='用户名'),
    'email': fields.String(required=True, description='电子邮件'),
    'nickname': fields.String(description='昵称'),
    'bio': fields.String(description='个人简介'),
    'age': fields.Integer(description='年龄'),
    'gender': fields.String(description='性别'),
    'phone': fields.String(description='电话号码'),
    'birth_date': fields.Date(description='出生日期'),
    'address': fields.String(description='地址'),
    'avatar': fields.String(description='头像URL'),
    'interests': fields.String(description='兴趣爱好'),
    'website': fields.String(description='个人网站'),
    'is_public': fields.Boolean(description='是否公开资料'),
    'is_active': fields.Boolean(description='是否激活'),
    'is_admin': fields.Boolean(description='是否管理员'),
    'roles': fields.List(fields.String(), description='用户角色列表'),
    'created_at': fields.DateTime(description='创建时间', readonly=True),
    'updated_at': fields.DateTime(description='更新时间', readonly=True),
    # v2 新增字段
    'last_login': fields.DateTime(description='最后登录时间', readonly=True),
    'login_count': fields.Integer(description='登录次数', readonly=True),
    'profile_views': fields.Integer(description='资料查看次数', readonly=True),
    'verified': fields.Boolean(description='是否已验证邮箱', readonly=True)
})

# 用户创建 DTO (不包含只读字段)
user_create_model = user_ns.model('UserCreate', {
    'username': fields.String(required=True, description='用户名'),
    'email': fields.String(required=True, description='电子邮件'),
    'password': fields.String(required=True, description='密码'),
    'nickname': fields.String(description='昵称'),
    'bio': fields.String(description='个人简介'),
    'age': fields.Integer(description='年龄'),
    'gender': fields.String(description='性别'),
    'phone': fields.String(description='电话号码'),
    'birth_date': fields.Date(description='出生日期'),
    'address': fields.String(description='地址'),
    'avatar': fields.String(description='头像URL'),
    'interests': fields.String(description='兴趣爱好'),
    'website': fields.String(description='个人网站'),
    'is_public': fields.Boolean(description='是否公开资料', default=True)
})

# 用户更新 DTO (所有字段都是可选的)
user_update_model = user_ns.model('UserUpdate', {
    'nickname': fields.String(description='昵称'),
    'bio': fields.String(description='个人简介'),
    'age': fields.Integer(description='年龄'),
    'gender': fields.String(description='性别'),
    'phone': fields.String(description='电话号码'),
    'birth_date': fields.Date(description='出生日期'),
    'address': fields.String(description='地址'),
    'avatar': fields.String(description='头像URL'),
    'interests': fields.String(description='兴趣爱好'),
    'website': fields.String(description='个人网站'),
    'is_public': fields.Boolean(description='是否公开资料')
})

# 分页响应模型
paginated_users_model = user_ns.model('PaginatedUsers', {
    'users': fields.List(fields.Nested(user_model), description='用户列表'),
    'pagination': fields.Nested(user_ns.model('Pagination', {
        'page': fields.Integer(description='当前页码'),
        'per_page': fields.Integer(description='每页数量'),
        'total': fields.Integer(description='总记录数'),
        'pages': fields.Integer(description='总页数'),
        'has_prev': fields.Boolean(description='是否有上一页'),
        'has_next': fields.Boolean(description='是否有下一页'),
        'prev_num': fields.Integer(description='上一页页码'),
        'next_num': fields.Integer(description='下一页页码')
    })),
    # v2 新增字段
    'filters': fields.Raw(description='应用的过滤器'),
    'sort': fields.String(description='排序方式')
})

# 通用响应模型
success_response_model = user_ns.model('SuccessResponse', {
    'success': fields.Boolean(description='操作是否成功'),
    'message': fields.String(description='响应消息'),
    # v2 新增字段
    'timestamp': fields.DateTime(description='响应时间戳'),
    'request_id': fields.String(description='请求ID')
})

error_response_model = user_ns.model('ErrorResponse', {
    'success': fields.Boolean(description='操作是否成功', default=False),
    'message': fields.String(description='错误消息'),
    'errors': fields.Raw(description='详细错误信息'),
    # v2 新增字段
    'timestamp': fields.DateTime(description='响应时间戳'),
    'request_id': fields.String(description='请求ID'),
    'error_code': fields.String(description='错误代码')
})